import { MCPTool } from "@aicu/mcp-framework";
import { z } from "zod";
import fs from 'node:fs';
import path from 'node:path';

interface GetfilecontentsInput {
  filePath: string;
}

class GetfilecontentsTool extends MCPTool<GetfilecontentsInput> {
  name = "获取本地文件内容";
  description = "获取指定路径的本地文件的内容。对于文本文件返回文本内容，对于图片文件返回base64编码的数据URL（可直接在HTML中使用）";

  schema = {
    filePath: {
      type: z.string(),
      required: true,
      description: "要读取的文件的本地路径（绝对路径）",
    },
  };

  async execute(input: GetfilecontentsInput) {
    const { filePath } = input;
    try {
      // 检查文件是否存在
      if (!fs.existsSync(filePath)) {
        return `错误：文件不存在 - ${filePath}`;
      }

      // 获取文件扩展名
      const ext = path.extname(filePath).toLowerCase();

      // 定义图片和二进制文件扩展名
      const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.ico'];
      const binaryExtensions = [...imageExtensions, '.pdf', '.zip', '.rar', '.7z', '.exe', '.dll'];

      // 读取文件内容
      const buffer = fs.readFileSync(filePath);

      // 如果是图片文件，返回base64数据URL
      if (imageExtensions.includes(ext)) {
        const base64 = buffer.toString('base64');
        const mimeType = this.getMimeType(ext);

        return {
          type: 'image',
          filename: path.basename(filePath),
          size: buffer.length,
          mimeType: mimeType,
          dataUrl: `data:${mimeType};base64,${base64}`,
          base64: base64
        };
      }

      // 如果是其他二进制文件，返回base64
      if (binaryExtensions.includes(ext)) {
        const base64 = buffer.toString('base64');

        return {
          type: 'binary',
          filename: path.basename(filePath),
          size: buffer.length,
          extension: ext,
          base64: base64
        };
      }

      // 否则作为文本文件读取
      const text = buffer.toString('utf-8');
      return {
        type: 'text',
        filename: path.basename(filePath),
        size: buffer.length,
        content: text
      };

    } catch(e: any) {
      return `读取文件失败：${e.message}`;
    }
  }

  // 根据扩展名获取MIME类型
  private getMimeType(ext: string): string {
    const mimeTypes: { [key: string]: string } = {
      '.jpg': 'image/jpeg',
      '.jpeg': 'image/jpeg',
      '.png': 'image/png',
      '.gif': 'image/gif',
      '.bmp': 'image/bmp',
      '.webp': 'image/webp',
      '.svg': 'image/svg+xml',
      '.ico': 'image/x-icon'
    };

    return mimeTypes[ext] || 'application/octet-stream';
  }
}

module.exports = GetfilecontentsTool;